home *** CD-ROM | disk | FTP | other *** search
/ Network Supervisor's Toolkit / Network Supervisor's Toolkit.iso / tools / lu62 / lu.c < prev    next >
C/C++ Source or Header  |  1996-07-10  |  2KB  |  86 lines

  1. /*
  2.   This subroutine forces the LU module become TSR.
  3.  
  4.   CopyRight 1995. Nicholas Poljakov all rights reserved.
  5.  
  6.  */
  7.  
  8. #include <dos.h>
  9. #include <malloc.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <psp.h>
  13.  
  14. /* Stack and pointer checking off */
  15. #pragma check_stack( off )
  16. #pragma check_pointer( off )
  17. #pragma intrinsic( _enable, _disable )
  18.  
  19. /* Prototypes for interrupt function */
  20. void (_interrupt _far *oldint68)( void );
  21. void _interrupt _far rout( unsigned _es, unsigned _ds, unsigned _di,
  22.                    unsigned _si, unsigned _bp, unsigned _sp,
  23.                    unsigned _bx, unsigned _dx, unsigned _cx,
  24.                    unsigned _ax, unsigned _ip, unsigned _cs,
  25.                    unsigned _flags );
  26.  
  27. /* Huge pointers force compiler to do segment arithmetic for us. */
  28.  
  29. extern char svarea;
  30. extern struct psp psp_ini;
  31. extern _interrupt _far prtable();
  32.  
  33. char _huge *tsrstack;
  34. char _huge *altstack;
  35. char _huge *tsrbottom;
  36.  
  37. unsigned ProgPrefix;
  38.  
  39. void main()
  40.         {
  41.             unsigned tsrsize;
  42.             unsigned env_seg;
  43.             unsigned *t_seg;
  44.         char _near *p;
  45.  
  46.             /* Initialize stack and bottom of program. */
  47.         _asm {
  48.              mov  ax, seg tsrstack
  49.              mov  es, ax
  50.              mov  WORD PTR es:tsrstack[0], sp
  51.              mov  WORD PTR es:tsrstack[2], ss
  52.                      mov  ax, seg svarea
  53.                      mov  es, ax
  54.                      mov  ax, seg psp_ini
  55.                      mov  WORD PTR es:svarea[22], ax
  56.                      mov  ax, offset psp_ini
  57.                      mov  WORD PTR es:svarea[20], ax
  58.                  }
  59.  
  60.             FP_SEG( tsrbottom ) = _psp;
  61.             FP_OFF( tsrbottom ) = 0;
  62.  
  63.             ProgPrefix = _psp;   /* Save PSP value */
  64.  
  65.             p = _psp;
  66.             FP_SEG( t_seg ) = p;
  67.             FP_OFF( t_seg ) = 0x2c;
  68.             env_seg = *t_seg;    /* Segment of DOS env. */
  69.             _dos_freemem( env_seg ); /* free it */
  70.  
  71.             /* Program size is:
  72.              *     top of stack
  73.              *   - bottom of program (converted to paragraphs)
  74.              *   + one extra paragraph
  75.              */
  76.             tsrsize = ((tsrstack - tsrbottom) >> 4) + 1;
  77.  
  78.  
  79.             /* Replace existing int68 routine with our. */
  80.             oldint68 = _dos_getvect( 0x68 );
  81.             _dos_setvect( 0x68, prtable );
  82.  
  83.             /* Free the PSP segment and terminate with program resident. */
  84.             _dos_keep( 0, tsrsize );
  85.         }
  86.